
#ifndef _BSP_GPIO_H
#define _BSP_GPIO_H
#ifndef _BSP_GPIO_C
#define _BSP_GPIO_C extern
#endif

/********************************************************************************************
* include:
********************************************************************************************/
#include "BSP_Config.h"

#define BITBAND(addr,bitnum)   ((((uint32_t)addr)&(0xF0000000))+(0x2000000)+((((uint32_t)addr)&(0x0000FFFFF))<<5)+((uint32_t)bitnum<<2))
#define MEM_ADDR(addr)         *((volatile unsigned long*)(addr))
#define BIT_ADDR(addr,bitnum)  MEM_ADDR(BITBAND(addr,bitnum))

#define IO_OUT_REG(port,pin)    BITBAND((port+12u), pin)
#define IO_IN_REG(port,pin)     BITBAND((port+ 8u), pin)

#define GPIOA_ODR_Addr          (GPIOA+0x14) //0x48000014
#define GPIOB_ODR_Addr          (GPIOB+0x14) //0x48000414

#define GPIOA_IDR_Addr          (GPIOA+0x10) //0x48000010
#define GPIOB_IDR_Addr          (GPIOB+0x10) //0x48000410

#define PAout(n)                BIT_ADDR(GPIOA_ODR_Addr,n)  //输出
#define PAin(n)                 BIT_ADDR(GPIOA_IDR_Addr,n)  //输入

#define PBout(n)                BIT_ADDR(GPIOB_ODR_Addr,n)  //输出
#define PBin(n)                 BIT_ADDR(GPIOB_IDR_Addr,n)  //输入

/********************************************************************************************
* Define:
********************************************************************************************/
#define OUT(x,y)                        BIT_ADDR((x+0x14u),y)
#define IN(x,y)                         BIT_ADDR((x+0x10u),y)

#define gpio_in_config(port,pin)        gpio_init(port,GPIO_MODE_INPUT,GPIO_PUPD_NONE,GPIO_OTYPE_PP,GPIO_OSPEED_2MHZ,BIT(pin))
#define gpio_upIn_config(port,pin)      gpio_init(port,GPIO_MODE_INPUT,GPIO_PUPD_PULLUP,GPIO_OTYPE_PP,GPIO_OSPEED_2MHZ,BIT(pin))
#define gpio_out_config(port,pin)       gpio_init(port,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_OTYPE_PP,GPIO_OSPEED_2MHZ, BIT(pin))
#define gpio_nc_config(port,pin)       {gpio_init(port,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_OTYPE_PP,GPIO_OSPEED_2MHZ,BIT(pin));GPIO_BC(port)|=BIT(pin);}
#define gpio_out0_config(port,pin)     {gpio_init(port,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_OTYPE_PP,GPIO_OSPEED_2MHZ,BIT(pin));GPIO_BC(port)|=BIT(pin);}
#define gpio_out1_config(port,pin)     {gpio_init(port,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_OTYPE_PP,GPIO_OSPEED_2MHZ,BIT(pin));GPIO_BOP(port)|=BIT(pin);}

//input
#define PORT_NTC_ADC            GPIOB
#define  PIN_NTC_ADC            1

//output
#define PORT_EN_PWR             GPIOA   
#define  PIN_EN_PWR             15

#define PORT_EN_NET             GPIOB   
#define  PIN_EN_NET             15

//input
#define InNtcAdc                IN(PORT_NTC_ADC        ,PIN_NTC_ADC         )   //0: absent 1: normal

//output
#define IoEnPwr                 OUT(PORT_EN_PWR        ,PIN_EN_PWR         )   //1:on 0:off
#define IoEnNet                 OUT(PORT_EN_NET        ,PIN_EN_NET         )   //1:on 0:off

/********************************************************************************************
* Datas:
********************************************************************************************/


/********************************************************************************************
* Function:
********************************************************************************************/
_BSP_GPIO_C void gpio_init(uint32_t gpio_periph, uint32_t mode, uint32_t pull_up_down, uint32_t out_type, uint32_t speed, uint32_t pin);
_BSP_GPIO_C void bsp_gpio_init(void);

#endif
